<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /**
         *  Promise 用来解决异步回调地狱
         *  1. Promise对象，有两个属性 
         *      1-1. PromiseState： 状态 :[pending, fulfilled, rejected]
         *      1-2. PromiseResult：结果值[成功、失败]
         *  2. 创建promise对象,以及改变promise对象状态
         *      2-1. let p = new Promise(()=>{})    ===> pending  undefined
         *      2-2. let p = new Promise((resolve, reject)=>{resolve('ok')})   ==> fulfilled   ok
         *      2-3. let p = new Promise((resolve, reject)=>{reject('err')})   ==> rejected    err
         *  3. 状态的改变，只能改变一次
         *      3-1. pending ==> fulfilled
         *      3-2. pending --> rejected
         *  4. then 
         *      语法：p.then(成功回调,失败回调)
         *      作用：给promise对象指定成功和失败的回调函数
         *      4-1. 当p是fulfilled ===> then方法成功的回调
         *      4-2. 当P是rejected => then方法失败的回调
         *  5. then方法的返回值：
         *      由执行了成功或失败回调函数的返回值决定
         *      返回值的和then的返回值的关系：
         *      5-1. return 非Promise对象  一定是一个成功的promise，返回的值就是promise的成功的结果值
         *      5-2. return Promise对象，你成功我也成功，你失败我也失败
         *      5-3. throw  一定是一个失败的promise，throw就是失败的结果值
         *  6. then 成功和失败回调函数默认值的问题
         *      6-1. 成功回调的默认值： value=>value
         *      6-2. 失败回调的默认值:  reason => new Promise((resolve, reject)=>reject(reason));
         *  7. promise的执行器函数的回调函数是同步的回调，then指定的成功和失败的回调是异步的回调
         */

        // 2-1
        // let p = new Promise((resolve, reject)=>{

        // })
        // console.log('p: ', p);

        // 2-2  fulfilled ok
        // let p = new Promise((resolve,reject)=>{
        //     resolve('ok')
        // })

        //2-3.  rejected err
        // let p = new Promise((resolve,reject)=>{
        //     reject('err')
        // })

        // 3.  fulfilled ok
        // let p = new Promise((resolve, reject)=>{
        //     resolve('ok');
        //     reject('err');// 不生效
        // })

        // 4. then指定回调函数
        // let p = new Promise((resolve, reject)=>{
        //     resolve('ok')
        // })
        // //执行成功的回调，并且value值为ok，因为p是fulfilled ，p的结果值是ok
        // p.then(value=>{

        // },reason=>{

        // })

        // 5. then方法的返回值
        //    5-1. 首先需要判断then执行了成功的回调还是失败的回调【判断依据.p的状态】
        //    5-2. 真正执行的那个回调函数，他的返回值
        //         5-2-1. return  非Promise   ===> fulfilled  
        //         5-2-2. return Promise对象  ===> 
        //         5-2-3. throw               ===> rejected

        // let p = new Promise((resolve, reject)=>{
        //     resolve('ok');
        // })
        // let res = p.then(value=>{

        // }, reason=>{

        // })

        // 6. 
        // let p = new Promise((resolve, reject)=>{
        //     // resolve('ok')
        //     reject('err')
        // })

        // // p.then(value=>{return value;}) //成功回调默认值
        // // p.then(null, reason=>new Promise((resolve,reject)=>reject(reason)))
        // p.then()
        // .then(value=>{
        //     console.log('value: ',value);
        // },reason=>{
        //     console.log(reason);
        // })

        // 7. 
        // let p = new Promise((resolve,reject)=>{
        //     console.log(1);
        //     resolve('ok');
        // })
        // console.log(2);
        // p.then(value=>{
        //     console.log(value);
        // })
        // console.log('then end');

    </script>
</body>
</html>